import { userStore } from '@/stores'
import { appConfig } from '@/config/index.js'
import { ref } from 'vue'
import { Md5 } from 'ts-md5'

const baseURL = appConfig.apiBaseUrl
const appVersion = ref()
const RndNum = (n) => {
  let rnd = ''
  for (let i = 0; i < n; i++) rnd += Math.floor(Math.random() * 10)
  return rnd
}
const app = ref({}) //设备信息
const cid = ref(null)
const requestTime = ref(null) //请求时间
const requestLng = ref(null) //请求位置
const requestLat = ref(null) //请求位置
const requestTimeReduce = ref('') //请求时间差（m）
const newRndNum = ref(RndNum(11)) //11位随机数
const timestamp = ref(Date.now()) //时间戳
uni.getSystemInfo({
  success: function (r) {
    app.value = r
  },
})
if (requestTime.value) {
  requestTimeReduce.value = (Date.now() - requestTime.value) / (1000 * 60)
}
if (!requestTime.value || (requestTimeReduce.value && requestTimeReduce.value > 5)) {
  // 华为审核问题,暂时写死
  // uni.getLocation({
  //   type: 'wgs84',
  //   success: function (mapLocation) {
  //     requestLng.value = mapLocation.longitude
  //     requestLat.value = mapLocation.latitude
  //     requestTime.value = Date.now()
  //   },
  // })
  requestLng.value = '116.3318244904881'
  requestLat.value = '39.92064517238347'
  requestTime.value = Date.now()
}
// #ifdef APP-PLUS
plus.runtime.getProperty(plus.runtime.appid, function(info) {
  appVersion.value = info.version;
});
plus.push.getClientInfoAsync((info) => {
  cid.value = info["clientid"];
  console.log(cid.value)
});
// #endif
// 对请求头进行处理
const handleRequestOptions = (options: UniApp.RequestOptions, requestType: String) => {
  const md5: any = new Md5()
  let sign = JSON.stringify(options.data) + newRndNum.value + timestamp.value + 'a17af174-25e6-34a0-a5e8-2adff02fb015'
  md5.appendAsciiStr(sign)
  sign = md5.end()
  const newHeader = {
    ...options.header,
    'service-code': 'H5',
    longitude: requestLng.value,
    latitude: requestLat.value,
    nonce: newRndNum.value,
    timestamp: timestamp.value,
    'device-id': app.value.deviceId,
    cid: cid.value,
    'device-type': app.value.platform,
    'device-os-version': app.value.brand + '-' + app.value.model + '-' + app.value.system,
    sign: sign,
    'client-type': app.value.osName == 'ios' ? 2 : 1,
    'app-version': appVersion.value,
    'api-version': appConfig.api_version,
  }
  if (requestType == 'request') {
    newHeader['content-type'] = 'application/json;charset=UTF-8'
  }
  if (options.url.indexOf('http') < 0) {
    // #ifdef APP-PLUS
    options.url = getApp().globalData.requestUrl + options.url
    // #endif
    // #ifdef H5
    options.url = baseURL + options.url
    // #endif
  }
  options.timeout = 30000
  options.sslVerify = false
  // 添加app端请求头标识
  options.header = {
    ...newHeader,
  }
  // console.log(options)
  // 4. 添加 token 请求头标识
  const userInfoStore = userStore()
  const token = userInfoStore.profile?.ticket
  if (token) {
    options.header.ticket = token
  }
}

// 添加请求拦截器
uni.addInterceptor('request', {
  // 拦截前触发
  invoke(options: UniApp.RequestOptions) {
    // 1. 打印环境和配置信息
    console.log('当前环境（UNI_PLATFORM）:', process.env.UNI_PLATFORM);
    console.log('apiHost 配置:', appConfig.apiHost);
    console.log('apiBaseUrl 配置:', appConfig.apiBaseUrl);

    // 2. 打印原始 URL（未拼接前）
    console.log('原始请求路径:', options.url);
    // if (!options.header?.needLoading && options.header?.needLoading === undefined) {
    //   uni.showLoading()
    // }
    handleRequestOptions(options, 'request')

    // 4. 打印拼接后的最终 URL（关键！确认是否正确）
    console.log('最终请求 URL:', options.url);
  },
  // complete() {
  //   uni.hideLoading()
  // },
})
uni.addInterceptor('uploadFile', { invoke: (options) => handleRequestOptions(options, 'uploadFile') })

/**
 * 请求函数
 * @param  UniApp.RequestOptions
 * @returns Promise
 *  1. 返回 Promise 对象
 *  2. 获取数据成功
 *    2.1 提取核心数据 res.data
 *    2.2 添加类型，支持泛型
 *  3. 获取数据失败
 *    3.1 401错误  -> 清理用户信息，跳转到登录页
 *    3.2 其他错误 -> 根据后端错误信息轻提示
 *    3.3 网络错误 -> 提示用户换网络
 */
type Data<T> = {
  code: string
  msg: string
  result: T
}
// 2.2 添加类型，支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {
  // 1. 返回 Promise 对象
  return new Promise<Data<T>>((resolve, reject) => {
    uni.request({
      ...options,
      // 响应成功
      success(res) {
        if (res.statusCode == 200) {
          // 实际业务状态码
          if (res.data.code == 200) {
            resolve(res.data as Data<T>)
          } else if (res.data.code == 9000) {
            const userInfoStore = userStore()
            userInfoStore.clearProfile()
            uni.reLaunch({ url: '/pages/login/login' })
            reject(res)
          } else {
            // 其他错误 -> 根据后端错误信息轻提示
            uni.showToast({
              icon: 'none',
              title: res.data.message || '请求错误',
            })
            reject(res)
          }
        }
      },
      // 响应失败
      fail(err) {
        uni.showToast({
          icon: 'none',
          title: '网络错误，换个网络试试',
        })
        reject(err)
      },
    })
  })
}

export const post = ({ url, data, method = 'POST', header, beforeRequest, afterRequest, format }: UniApp.RequestOptions) => {
  return http({
    url,
    method,
    data,
    header,
    beforeRequest,
    afterRequest,
    format,
  })
}
